HyperText Transfer Protocol (HTTP) handlers take requests from a web page and process them in a predetermined fashion. There are a limited number of threads available to provide communication between a requesting client application and a web server. Synchronous HTTP handlers take a thread and keep it reserved for each request throughout the processing of that request. Once the request is completed by providing a result to the requesting application or a timeout, the reserved thread is returned to the available threads pool. Asynchronous HTTP handlers do not reserve the thread for the duration of the request and are, therefore, capable of serving many client requests with very few actual threads.
Asynchronous processing refers to the ability to perform some part of request on a separate thread or to temporarily defer it and to release the request processing thread to process another request. When used for non-CPU intensive tasks, such as network IO operations, this mechanism enables the maximization of the number of concurrent requests being processed by the system and enhancement of the perceived throughput of a server. In fact, depending on how intensely a handler-code uses asynchronous methods in its implementation, it is possible to peg the CPU(s) in a system using only a handful of threads while serving many times as many clients. Coding asynchronous processes is generally a complex and programming-intensive effort.